為了能夠建立容易辨識的Entity
名字,我們在schemas.py
內建立一個name_mapping
的dict
。
要建立name_mapping
,需要認識兩個Enum
:
GeneralEntityNames
儲存各Entity
通俗的名字。AutoCreatedEntityNames
儲存當各Entity
是由script產生,而我們又沒有指定名字的時候,需要添加的前綴字。name_mapping
的key
為GeneralEntityNames
的value
,value
為AutoCreatedEntityNames
的value
。透過name_mapping
我們就可以藉由通俗的Entity
名稱來取得相對應的前綴字。
# schemas.py
from enum import Enum
class GeneralEntityNames(str, Enum):
PART: str = 'part'
SET: str = 'set'
CONTACT: str = 'contact'
MATERIAL: str = 'material'
PROPERTY: str = 'property'
SECTION: str = 'section'
CURVE: str = 'curve'
class AutoCreatedEntityNames(str, Enum):
PART: str = 'auto_part_'
SET: str = 'auto_set_'
CONTACT: str = 'auto_contact_'
MATERIAL: str = 'auto_material_'
PROPERTY: str = 'auto_property_'
SECTION: str = 'auto_section_'
CURVE: str = 'auto_curve_'
name_mapping = dict(zip([member.value for member in GeneralEntityNames], [
member.value for member in AutoCreatedEntityNames]))
接著,我們建立一個_get_name
的function
來負責建立獨特的名字。這個function
先利用name_mapping
取得了各Entity
的前綴字,接著再加上各Entity
的建立時間及一些random的字串(備註
)。如此一來,在每個Entity
自動建立的時候,都可以有一個容易辨識又不會重覆的名字,例如:auto_material_20220901_15151662189319_ce0fd0
。另外,如果名字內有其建立時間的話,於debug查找各Entity
建立先後次序時,也會比較方便。
我們將_get_name
存於name_fetchers.py
,並透過它建立每一種Entity
產生名字的function
,如get_one_part_name
、get_one_set_name
及get_one_material_name
等。由於我們在_get_name
中使用了short circuit的技巧,所以當沒有指定名字的時候,_get_name
會自動產生適合的名字;但當有指定名字的時候,則會直接回傳指定的名字,保留了命名的彈性。
# name_fetchers.py
import uuid
from datetime import datetime
from schemas import GeneralEntityNames, name_mapping
def _get_datetime():
return datetime.now().strftime('%Y%m%d_%H%M%s')
def _get_name(general_entity_name, name=None):
return (name or (name_mapping.get(general_entity_name) +
_get_datetime() +
'_' +
uuid.uuid4().hex[:6]))
def get_one_part_name(name=None):
return _get_name(GeneralEntityNames.PART.value, name)
def get_one_set_name(name=None):
return _get_name(GeneralEntityNames.SET.value, name)
def get_one_contact_name(name=None):
return _get_name(GeneralEntityNames.CONTACT.value, name)
def get_one_material_name(name=None):
return _get_name(GeneralEntityNames.MATERIAL.value, name)
def get_one_proprty_name(name=None):
return _get_name(GeneralEntityNames.PROPERTY.value, name)
def get_one_section_name(name=None):
return _get_name(GeneralEntityNames.SECTION.value, name)
def get_one_curve_name(name=None):
return _get_name(GeneralEntityNames.CURVE.value, name)
或許有些先進會覺得_get_datetime
已經足以建立一個獨特的名字,我們一開始也是這麼想的。直到我們做到了某些project,需要由外部呼叫ANSA、平行計算、或是使用asyncio
的時候,就會遇到一些問題。所以後來才決定在最後,加上一些uuid
產生的字串。